/*!
 * 文件名称： driver_public.h
 * 描    述： public 驱动文件
 * 版本：     2023-12-03, V1.0
*/

/*
* GD32F303东方红开发板V1.0
* 淘宝商城：   https://juwo.taobao.com
* 技术交流：   https://www.gd32bbs.com/ask/
* 视频学习：   https://space.bilibili.com/475462605
* 微信公众号： gd32bbs
* Copyright    苏州聚沃电子科技有限公司
* 版权所有，盗版必究。
*/

#ifndef __PUBLIC_H_
#define __PUBLIC_H_

#include "gd32f30x.h"

#define LCD_DEBUG  1


#if (LCD_DEBUG == 1)
    #include "bsp_lcd.h"
    #define printf_log(format, ...)   printf(format, ##__VA_ARGS__);bsp_lcd_printf(format, ##__VA_ARGS__);
#else
    #define printf_log(format, ...)   printf(format, ##__VA_ARGS__);
#endif                                  
    
extern volatile uint64_t driver_tick;

typedef enum {DRV_ERROR = 0, DRV_SUCCESS = !DRV_ERROR} Drv_Err;

typedef struct __typdef_tick_handle{
    uint16_t tick_value;
    void (*tick_task_callback)(void);  
}typdef_tick_handle ;

extern typdef_tick_handle driver_tick_handle[];

typedef union  _com_union{
    uint8_t Com_State ;
    struct {
        uint8_t RecSuccess:1 ;
        uint8_t SendSucess:1 ;
        uint8_t RecState:  1 ;
        uint8_t SendState: 1 ;
        uint8_t Dir:       1 ;
        uint8_t Unused    :4 ;
    }Bits ;
}com_union;

typedef struct __typdef_com_control_general{
    com_union Com_Flag ;
    uint8_t*  p_Rec;
    uint8_t*  p_Send;
    uint16_t  SendSize;
    uint16_t  SendCount;
    uint16_t  RecSize;    
    uint16_t  RecCount;     
}typdef_com_control_general ;

typedef enum
{
    MODE_POLL,     
    MODE_DMA,    
    MODE_INT,   
}com_mode_enum;

#include "driver_gpio.h"
#include "driver_dma.h"
#include "stdlib.h"
#include <stdio.h>
#include <string.h> 

/*宏定义*/
/*变量/代码存储位置*/
#define SDRAM_GLOBAL  _Pragma("location = \".sdram\"")    //存储至SDRAM
#define INRAM_GLOBAL  _Pragma("location = \".inram\"")    //存储至内部ram中
#define INSRAM_GLOBAL _Pragma("location = \".insram\"")   //存储至内部TCMSRAM中，只支持数据存储
#define EXSRAM_GLOBAL _Pragma("location = \".exsram\"")   //存储至外部SRAM中
#define INROM_CONST   _Pragma("location = \".rom_data\"") //存储至内部rom data area中

void driver_init(void);
void delay_us(uint32_t count);
void delay_ms(uint32_t count);
void driver_tic_inc(void);
void delay_sysclk(uint32_t count);
//void printf_log(const char * sFormat, ...);
Drv_Err memory_compare(uint8_t* src, uint8_t* dst, uint16_t length);


#endif /*#ifndef __PUBLIC_H_*/
